From: Martin Röder Date: Wed, 18 Oct 2023 16:32:34 +0000 (+0200) Subject: Fix AVL tree traversal in cache_record_find and cache_host_is_known X-Git-Url: http://git.openwrt.org/feed/telephony.git%5Eaffee75beff7ed8445f6bc84deff13465c331027?a=commitdiff_plain;h=c286c51a9bd931d023a55988c0e89574ee6d8ffa;p=project%2Fmdnsd.git Fix AVL tree traversal in cache_record_find and cache_host_is_known The AVL tree traversal in both functions systematically misses the last AVL tree element. This can lead to duplicate cache entries and lookup failures. The fix duplicates the correct AVL tree traversal approach of cache_dump_recursive(). Signed-off-by: Martin Röder Signed-off-by: Felix Fietkau --- diff --git a/cache.c b/cache.c index 8c851a3..0ed52d7 100644 --- a/cache.c +++ b/cache.c @@ -197,13 +197,10 @@ cache_record_find(char *record, int type, int port, int rdlength, uint8_t *rdata { struct cache_record *l = avl_find_element(&records, record, l, avl); - if (!l) - return NULL; - - while (l && !avl_is_last(&records, &l->avl) && !strcmp(l->record, record)) { + while (l && !strcmp(l->record, record)) { struct cache_record *r = l; - l = avl_next_element(l, avl); + l = !avl_is_last(&records, &l->avl) ? avl_next_element(l, avl) : NULL; if (r->type != type) continue; @@ -233,13 +230,10 @@ cache_host_is_known(char *record) { struct cache_record *l = avl_find_element(&records, record, l, avl); - if (!l) - return 0; - - while (l && !avl_is_last(&records, &l->avl) && !strcmp(l->record, record)) { + while (l && !strcmp(l->record, record)) { struct cache_record *r = l; - l = avl_next_element(l, avl); + l = !avl_is_last(&records, &l->avl) ? avl_next_element(l, avl) : NULL; if ((r->type != TYPE_A) && (r->type != TYPE_AAAA)) continue; return 1;